package com.lnwazg.kit.type;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * Java所有的基本类型的枚举，包括原始类型和包装类型
 * @author nan.li
 * @version 2017年6月28日
 */
public enum BasicType
{
    BYTE, SHORT, INT, INTEGER, LONG, DOUBLE, FLOAT, BOOLEAN, CHAR, CHARACTER, STRING;
    
    /**
     * 包装类型映射表<br>
     * 包装类型为Key，原始类型为Value，例如： Integer.class -> int.class.
     */
    public static final Map<Class<?>, Class<?>> wrapperPrimitiveMap = new HashMap<Class<?>, Class<?>>(8);
    
    /**
     * 包装类型的集合表
     */
    public static Set<Class<?>> wrapperSet = new HashSet<>();
    
    /**
     * 原始类型映射表<br>
     * 原始类型为Key，包装类型为Value，例如： int.class -> Integer.class.
     */
    public static final Map<Class<?>, Class<?>> primitiveWrapperMap = new HashMap<Class<?>, Class<?>>(8);
    
    /**
     * 原始类型的集合表
     */
    public static Set<Class<?>> primitiveSet = new HashSet<>();
    
    static
    {
        //常见的8大基本类型
        wrapperPrimitiveMap.put(Boolean.class, boolean.class);
        wrapperPrimitiveMap.put(Byte.class, byte.class);
        wrapperPrimitiveMap.put(Character.class, char.class);
        wrapperPrimitiveMap.put(Double.class, double.class);
        wrapperPrimitiveMap.put(Float.class, float.class);
        wrapperPrimitiveMap.put(Integer.class, int.class);
        wrapperPrimitiveMap.put(Long.class, long.class);
        wrapperPrimitiveMap.put(Short.class, short.class);
        
        for (Map.Entry<Class<?>, Class<?>> entry : wrapperPrimitiveMap.entrySet())
        {
            primitiveWrapperMap.put(entry.getValue(), entry.getKey());
            wrapperSet.add(entry.getKey());
            primitiveSet.add(entry.getValue());
        }
    }
    
    public static void main(String[] args)
    {
        System.out.println(primitiveSet.contains(int.class));
        //true
        
        System.out.println(primitiveSet);
        //[float, boolean, double, byte, int, char, short, long]
        
        System.out.println(wrapperSet);
        //[class java.lang.Character, class java.lang.Integer, class java.lang.Long, class java.lang.Float, class java.lang.Boolean, class java.lang.Byte, class java.lang.Double, class java.lang.Short]
        
    }
    
    /**
     * 原始类转为包装类，非原始类返回原类
     * @param clazz 原始类
     * @return 包装类
     */
    public static Class<?> wrap(Class<?> clazz)
    {
        if (null == clazz || false == clazz.isPrimitive())
        {
            return clazz;
        }
        Class<?> result = primitiveWrapperMap.get(clazz);
        return (null == result) ? clazz : result;
    }
    
    /**
     * 包装类转为原始类，非包装类返回原类
     * @param clazz 包装类
     * @return 原始类
     */
    public static Class<?> unWrap(Class<?> clazz)
    {
        if (null == clazz || clazz.isPrimitive())
        {
            return clazz;
        }
        Class<?> result = wrapperPrimitiveMap.get(clazz);
        return (null == result) ? clazz : result;
    }
}
